package Presentacion.Presupuesto;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.RowFilter;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import Fisica.ClienteFisica;
import Fisica.DuenoFisica;
import Fisica.PresupuestoFisica;
import Hibernate.Cliente;
import Hibernate.Dueno;
import Hibernate.Presupuesto;
import Hibernate.Vehiculo;
import Logica.ClienteLogica;
import Logica.DuenoLogica;
import Logica.PresupuestoLogica;
import Logica.VehiculoLogica;
import Logica.Validacion.PresupuestoValidacion;
import Presentacion.Main.MainTallerMitre;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class PresupuestoBuscar extends JDialog {

	private final JPanel contentPanel = new JPanel();
	private JTable jTPresupuestoBuscar;
	private JTextField jTFPresupuestoBuscarFiltro;
/*JTextField marca, JTextField modelo, JTextField cat, 
			JTextField patente, JTextField color, JTextField ano, 
			JTextField apellido, JTextField nombre, JTextField direccion, JTextField telefono, JTextField mail, 
			JTextArea trabajos, JTextField costo, JTextField km, JTextField fecha, JCheckBox confirmado*/
	private JTextArea trabajos;
	private JTextField marca, modelo, cat, 
					patente, color, ano, 
					apellido, nombre, direccion, telefono, mail, 
					costo, km, fecha;
	private JCheckBox confirmado;
	boolean editable;
	
	public DefaultTableModel model = new DefaultTableModel();
	public TableRowSorter<TableModel> modeloOrdenado; //usado para ordenar en el filtrado
	
	/**Atributos de alinear tablas*/	
	private DefaultTableCellRenderer alinearCentro, alinearDerecha, alinearIzquierda;
	
	

//	/**
//	 * Launch the application.
//	 */
//	public static void main(String[] args) {
//		try {
//			PresupuestoBuscar dialog = new PresupuestoBuscar();
//			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
//			dialog.setVisible(true);
//			dialog.setLocationRelativeTo(null);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//	}

	/**
	 * Create the dialog.
	 * @param validoHasta 
	 * @param tiempoEstimado 
	 * @param costo 
	 * @param trabajos 
	 * @param mail 
	 * @param telefono 
	 * @param direccion 
	 * @param nombre 
	 * @param apellido 
	 * @param ano 
	 * @param color 
	 * @param patente 
	 * @param cat 
	 * @param modelo 
	 * @param marca 
	 */
	public PresupuestoBuscar(JTextField marca, JTextField modelo, JTextField cat, 
			JTextField patente, JTextField color, JTextField ano, 
			JTextField apellido, JTextField nombre, JTextField direccion, JTextField telefono, JTextField mail, 
			JTextArea trabajos, JTextField costo, JTextField km, JTextField fecha, JCheckBox confirmado, boolean editable) {
//inicializo alineaciones de tabla.
		this.initAlineacionTablas();
		
		this.marca = marca;
		this.modelo = modelo;
		this.cat = cat;
		this.patente = patente;
		this.color = color;
		this.ano = ano;
		this.apellido = apellido;
		this.nombre = nombre;
		this.direccion = direccion;
		this.telefono = telefono;
		this.mail = mail;
		this.trabajos = trabajos;
		this.costo = costo;
		this.km = km;
		this.fecha = fecha;
		this.confirmado = confirmado;
		this.editable = editable;
		
		setTitle("Buscar Presupuesto");
		setBounds(100, 100, 796, 393);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(null);
		
		JScrollPane jSPTablaPresupuestoBuscar = new JScrollPane();
		jSPTablaPresupuestoBuscar.setBounds(10, 11, 760, 309);
		contentPanel.add(jSPTablaPresupuestoBuscar);
		
		jTPresupuestoBuscar = new JTable();
		jTPresupuestoBuscar.setToolTipText("Seleccione un presupuesto");

		jSPTablaPresupuestoBuscar.setViewportView(jTPresupuestoBuscar);
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setBounds(0, 319, 770, 34);
			contentPanel.add(buttonPane);
			buttonPane.setLayout(null);
			{
				JButton okButton = new JButton("Aceptar");
				okButton.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						aceptar();
					}
				});
				okButton.setBounds(593, 5, 80, 23);
				okButton.setActionCommand("OK");
				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
			{
				JButton cancelButton = new JButton("Cancel");
				cancelButton.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent arg0) {
						cerrar();
					}
				});
				cancelButton.setBounds(680, 5, 80, 23);
				cancelButton.setActionCommand("Cancel");
				buttonPane.add(cancelButton);
			}
			
			jTFPresupuestoBuscarFiltro = new JTextField();
			jTFPresupuestoBuscarFiltro.setToolTipText("Buscar en la tabla");
			jTFPresupuestoBuscarFiltro.setBounds(10, 5, 150, 23);
			buttonPane.add(jTFPresupuestoBuscarFiltro);
			jTFPresupuestoBuscarFiltro.setColumns(10);
		}
//cargo tabla con datos de clientes.
		this.initTablaListarPresupuesto();
		
//eventos teclado
		this.eventoTeclado();
		this.autoFiltro();	
		
		this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		this.setVisible(true);
		this.setLocationRelativeTo(null);
		
		
	}
	
	/**CARGA TABLAS LISTA DE PRESUPUESTOS*/
    public void initTablaListarPresupuesto(){
		model = new DefaultTableModel(
				new Object[][] {
						{null, null, null, null, null},
						{null, null, null, null, null},
					},
					new String[] {
						"Cliente", "Patente", "Color", "Emitido", "Importe"
					}
				) {
					Class[] columnTypes = new Class[] {
						String.class, String.class, String.class, String.class, String.class
					};
					//esta clase permite visualizar el checkbox en la tabla
					public Class getColumnClass(int columnIndex) {return columnTypes[columnIndex];}
				  };	
		jTPresupuestoBuscar.setModel(model);	 
		//esto me limpia la tabla cada vez que hago un listado nuevo
		model.setRowCount(0);
		
		List<Presupuesto>list = null;
		list = PresupuestoFisica.list();
		Dueno d;
		Cliente c;
		String cli;
		for (Presupuesto x : list) {
			d = DuenoFisica.findById(x.getIdduenio());
			c = ClienteFisica.findById(d.getIdcliente());
			cli = c.getApellido()+", "+c.getNombre();
			 model.addRow(new Object[] { 
					 cli,
					 d.getPatente(),
					 d.getColor(),
					 x.getFechaemision(),
					 x.getImporte()
					 });
			 }	
		
		jTPresupuestoBuscar.setToolTipText("Lista de Presupuestos");
		jTPresupuestoBuscar.getColumnModel().getColumn(0).setCellRenderer(alinearDerecha); //asigno alineacion centrada
		jTPresupuestoBuscar.getColumnModel().getColumn(1).setCellRenderer(alinearDerecha); //asigno alineacion centrada
		jTPresupuestoBuscar.getColumnModel().getColumn(2).setCellRenderer(alinearCentro); //asigno alineacion centrada
		jTPresupuestoBuscar.getColumnModel().getColumn(3).setCellRenderer(alinearCentro); //asigno alineacion centrada
		jTPresupuestoBuscar.getColumnModel().getColumn(4).setCellRenderer(alinearDerecha); //asigno alineacion centrada
		}
    
/**FIN CARGA TABLAS LISTA DE CLIENTES*/		
 
    
    /*Inicializo y cargo alineacinn de conlumnas en tablas*/	
	public void initAlineacionTablas(){
		alinearCentro = new DefaultTableCellRenderer();
		alinearDerecha = new DefaultTableCellRenderer();
		alinearIzquierda = new DefaultTableCellRenderer();
		
        alinearCentro.setHorizontalAlignment(SwingConstants.CENTER);
        alinearDerecha.setHorizontalAlignment(SwingConstants.RIGHT);
        alinearIzquierda.setHorizontalAlignment(SwingConstants.LEFT);
	}
	
/**  METODOS PARA FILTRAR LISTAS*/	
/*filtros: paso el texto capturado y la tabla a la cual se le aplica el filtro*/
		private void filtrarTabla(JTextField jtf, DefaultTableModel modEdit, JTable jtable) {
	        //codigo de filtro
			TableRowSorter<TableModel> modeloOrdenadoEdit = new TableRowSorter(modEdit);
	    	String fil = jtf.getText();//.toLowerCase();
	    	//filtrar todas las filas que tengan el texto "fil", sin discriminar minusculas de mayusculas.
	    	if (fil.length() != 0){
//anda perfecto con minuscula y mayuscula gracias al "(?i)".
	    		modeloOrdenadoEdit.setRowFilter (RowFilter.regexFilter("(?i)"+fil+"*.")); 
	        }else{//reestablezco la tabla original, buscando con vacio.
	        	modeloOrdenadoEdit.setRowFilter (RowFilter.regexFilter(""));        	
	    	}
	    	jtable.setRowSorter (modeloOrdenadoEdit);
	    	
	    }
		
	private void autoFiltro(){
		jTFPresupuestoBuscarFiltro.addKeyListener(new KeyListener()
		{
			public void keyReleased(KeyEvent arg0) 
			{	//paso como parametro, el JTField, DefaultTableModel, JTable
				filtrarTabla(jTFPresupuestoBuscarFiltro, model, jTPresupuestoBuscar);		}

			@Override
			public void keyPressed(KeyEvent e) {		}

			@Override
			public void keyTyped(KeyEvent e) {		}
    });
	}
	
//cerrar.	
	public void cerrar(){
		this.dispose();
	}
	
//devolver la fila seleccionada.	
	public void aceptar(){
		System.out.println("ACEPTAR");
		
		int seleccion = jTPresupuestoBuscar.getSelectedRow();
		if (seleccion != -1) {
//			"Cliente", "Patente", "Color", "Emitido", "Importe"
			String strApyNom, ape, nom, strPatente, strColor, strEmitido, strImporte;
			strApyNom = jTPresupuestoBuscar.getValueAt(seleccion, 0).toString();
			strPatente = jTPresupuestoBuscar.getValueAt(seleccion, 1).toString();
			strColor = jTPresupuestoBuscar.getValueAt(seleccion, 2).toString();
			strEmitido = jTPresupuestoBuscar.getValueAt(seleccion, 3).toString();
			strImporte = jTPresupuestoBuscar.getValueAt(seleccion, 4).toString();
			 
			ape = new String(strApyNom.substring(0, strApyNom.indexOf(",")));
			nom = new String(strApyNom.substring(strApyNom.lastIndexOf(",") + 2, strApyNom.length()));
			
//			Date fecha = PresupuestoValidacion.getDate(strEmitido);
			int importe = Integer.parseInt(strImporte);
			int iddueno = DuenoLogica.getByPatente(strPatente).getIdduenio();
			
			
			Presupuesto p = PresupuestoLogica.get(iddueno,strEmitido, importe);
			Cliente c =ClienteLogica.getByApYNom(ape, nom);
			Dueno d = DuenoLogica.getByPatente(strPatente);
			Vehiculo v = VehiculoLogica.getById(d.getIdvehiculo());
			
			MainTallerMitre.idPresupuestoModificar = (int)p.getIdpresupuesto();
			
			this.apellido.setEditable(true); 			this.apellido.setText(c.getApellido()); 		this.apellido.setEditable(this.editable);
			this.nombre.setEditable(true); 				this.nombre.setText(c.getNombre()); 			this.nombre.setEditable(this.editable);
			this.direccion.setEditable(true);			this.direccion.setText(c.getDireccion());		this.direccion.setEditable(this.editable);
			this.telefono.setEditable(true);			this.telefono.setText(c.getTelefono());			this.telefono.setEditable(this.editable);
			this.mail.setEditable(true);				this.mail.setText(c.getEmail());				this.mail.setEditable(this.editable);
			
			this.marca.setEditable(true);				this.marca.setText(v.getMarca());				this.marca.setEditable(this.editable);
			this.modelo.setEditable(true);				this.modelo.setText(v.getModelo());				this.modelo.setEditable(this.editable);
			this.cat.setEditable(true);					this.cat.setText(v.getTipo());					this.cat.setEditable(this.editable);
			this.patente.setEditable(true);				this.patente.setText(strPatente);			this.patente.setEditable(this.editable);
			this.color.setEditable(true);				this.color.setText(strColor);				this.color.setEditable(this.editable);
			this.ano.setEditable(true);					this.ano.setText(Integer.toString(d.getAno()));	this.ano.setEditable(this.editable);
			
			this.trabajos.setText(p.getTrabajos());	
			this.costo.setText(strImporte);
			this.km.setText(Integer.toString(p.getKm()));
			this.fecha.setEditable(true);	 			this.fecha.setText(strEmitido); 				this.fecha.setEditable(false);
			this.confirmado.setSelected(p.isTrabajo());
			
			cerrar();
			}
		else{
			JFrame frame = new JFrame();
            JOptionPane.showMessageDialog(frame, 
            		"*  Debe seleccionar un Presupuesto", "Error", 
            		JOptionPane.WARNING_MESSAGE);
			}
		
	}
	
	
	private void eventoTeclado() {

		 /** evento escape*/
			        KeyListener keyListenerEscape = new KeyAdapter() {
			            public void keyPressed(KeyEvent evt) {
			                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
			                	cerrar();
			                }
			            }
			        };
		/** evento enter*/
			        KeyListener keyListenerEnter = new KeyAdapter() {
			            public void keyPressed(KeyEvent evt) {
			                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
//			                    int i = 0;
//			                	guardar(null);
			                }
			            }
			        };
		/** evento de filtro de tablas listar de cada modulo*/
			        KeyListener keyListenerFiltroCliente = new KeyAdapter() {
			            public void keyPressed(KeyEvent evt) {
			                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
			                	filtrarTabla(jTFPresupuestoBuscarFiltro, model, jTPresupuestoBuscar);
			                }
			            }
			        };

			        
		/**ASIGNO EVENTOS TECLADO*/
		//EVENTOS CON ENTER
//			        panelCenter.addKeyListener(keyListenerEnter);
		//FIN EVENTOS CON ENTER
			        
		//EVENTOS CON ESCAPE
//			        panelCenter.addKeyListener(keyListenerEscape);
		//FIN EVENTOS CON ESCAPE
		        
		//EVENTOS CON ENTER
			        jTFPresupuestoBuscarFiltro.addKeyListener(keyListenerFiltroCliente);
		//FIN EVENTOS CON ENTER       
			      //EVENTOS CON F1 AYUDA        
			      //EVENTOS CON F2 EDITAR
			      //EVENTOS CON F3 BUSCAR
			      //EVENTOS CON F4 NUEVO
			      //EVENTOS CON F5 ACTUALIZAR
			      //EVENTOS CON F10 GUARDAR E IMPRIMIR
			      //EVENTOS CON F
			      //EVENTOS CON F
			        
			        
		       
			    
	}
    
}
